#!/usr/bin/env python3.11
# -*- encoding: utf-8 -*-
"""
@File    :   utils.py
@Time    :   2024/05/28 09:09:48
@Author  :   windstarry 
@Version :   1.0
"""
# here put the import lib
import os
import time
import uuid


def upload_directory_path(instance, filename):
    """
    生成上传文件的目录路径。

    参数:
    - instance: 上传文件的模型实例。
    - filename: 原始文件名。

    返回值:
    - 生成的文件存储路径，路径结构为: app_label/model_name/instance_pk/file_prefix_timeuuid.extension。
    """
    # 从文件名中提取文件扩展名
    prefix = filename.split(".")[-1]
    # 生成带有时间戳的临时文件名
    tmp_name = f"{filename}_{time.time()}"
    # 生成最终的文件名，使用UUID确保唯一性，且保持文件扩展名
    new_filename = f"{uuid.uuid5(uuid.NAMESPACE_DNS, tmp_name).__str__().replace('-', '')}.{prefix}"
    # 从模型实例中提取应用标签和模型名称
    labels = instance._meta.label_lower.split(".")
    # 拼接生成文件的完整存储路径
    return os.path.join(labels[0], labels[1], str(instance.pk), new_filename)


def list_to_tree(
    menus, parent_flag: str = "pid", children_key: str = "children"
) -> list:
    """
    将列表结构转换为树结构。

    :param menus: 列表，包含具有层级关系的项目，每个项目是一个字典。
    :param parent_flag: 字典中的键名，用于表示项目的父级标识。
    :param children_key: 生成树结构时，用于表示子项目的键名。
    :return: 转换后的树结构，以列表形式表示，每个元素是包含子元素的字典。
    """
    # 将输入的列表转换为以id为键的字典，方便快速查找
    menu_map = {menu["id"]: menu for menu in menus}
    arr = []

    for menu in menus:
        # 判断当前菜单是否有父级
        if mid := menu.get(parent_flag):
            # 检查父级菜单是否有子菜单，若无则创建
            if result := menu_map[mid].get(children_key):
                result.append(menu)
            else:
                menu_map[mid][children_key] = [menu]
        else:
            # 没有父级的菜单直接加入到最顶层
            arr.append(menu)

    return arr
